<?php
/*
BAN.INC.PHP by martin $ 2009/07/15 17:36:09
*/

checkADMIN();

$ban_ini_file = OD.'ban.ini.php';
$notcount_ini_file = OD.'notcount.ini.php';
$ngwords_ini_file = OD.'ngwords.ini.php';

include realpath($ban_ini_file);
include realpath($notcount_ini_file);
include realpath($ngwords_ini_file);

$header = $body = '';
$helperState = isset($_COOKIE['PPBLOG_HELPER_STATE']) ? $_COOKIE['PPBLOG_HELPER_STATE'] : 1;

if(($ip=v_('IP')) != ''){ // 拒否IPの登録
 if(!preg_match('/^\d{1,3}\.\d{1,3}\.\d{1,3}\.(\d{1,3}|\*)$/', $ip)){
  showMessage('送られた数字はIPアドレスっぽくないです...');
 } else {
  list($res, $index) = test_ip($ip, true);
  if($res==1){
   list(,$org,) = explode('|', $BAN_LIST[$index]);
   showMessage('そのIPは '.$org.' として既に登録済みです;-)');
  } elseif($res==-1){
   list(,$org,) = explode('|', $BAN_LIST[$index]);
   showMessage('IP: '.$ip.' を '.$org.' と入れ替えました');
   $BAN_LIST[$index] = time().'|'.$ip.'|0'.NL;
   rewrite_ini($ban_ini_file, $BAN_LIST);
  } else { // $res==0
   array_push($BAN_LIST, time().'|'.$ip.'|0');
   rewrite_ini($ban_ini_file, $BAN_LIST);
   showMessage('IP: '.$ip.' を拒否リストに追加しました');
  }
 }
}

if(($relip=v_('RELIP')) != ''){ // IPの解除
 $_LIST = v_('sub')=='cmtping' ? $BAN_LIST : $NC_LIST;
 $_ini = v_('sub')=='cmtping' ? $ban_ini_file : $notcount_ini_file;
 foreach ($_LIST as $i=>$ip){
  if(strstr($ip, '|'.$relip)){
   array_splice ($_LIST, $i, 1);
   rewrite_ini($_ini, $_LIST);
   showMessage('IP:'.$relip.' の'.(v_('sub')=='cmtping'?'拒否':'設定').'を解除しました');
   break;
  }
 }
}

if(($relex=v_('RELWORD')) != ''){ // キーワードの解除
 $_LIST = v_('sub')=='cmtping' ? $BAN_LIST : $NC_LIST;
 $_ini = v_('sub')=='cmtping' ? $ban_ini_file : $notcount_ini_file;
 foreach ($_LIST as $i=>$ex){
  if(strstr($ex, "|\t".$relex."\t|")){
   array_splice ($_LIST, $i, 1);
   rewrite_ini($_ini, $_LIST);
   showMessage('キーワード:'.$relex.' の'.(v_('sub')=='cmtping'?'拒否':'設定').'を解除しました');
   break;
  }
 }
}

if(($ngword=v_('NGWORD')) != ''){ # NGワードの登録
 $hit = preg_grep('{'.$ngword.'}i', $NG_WORDS);
 if(!empty($hit)){
  showMessage('そのワードは既に登録されています:)');
 } else {
  array_push($NG_WORDS, $ngword);
  rewrite_ini($ngwords_ini_file, $NG_WORDS);
  showMessage('NGワード： '.$ngword.' をリストに追加しました');
 }
}

if(($delword=my_decrypt(v_('DELNGWORD'))) != ''){ // NGワードの解除
 foreach ($NG_WORDS as $i=>$word){
  if(strstr($word, $delword)){
   array_splice ($NG_WORDS, $i, 1);
   rewrite_ini($ngwords_ini_file, $NG_WORDS);
   showMessage('NGワード:'.$delword.' を削除しました');
   break;
  }
 }
}

if(isset($_POST['ban-access']) && is_array($_POST['ban-access'])){
 $new_ban_list = array();
 foreach ($BAN_LIST as $i=>$ip){
  $ips = explode('|', $ip);
  $new = trim($_POST['ban-access'][$i]);
  if($new!=trim($ips[2])){
   $state = $new ? '拒否' : '許可';
   showMessage('IP: '.$ips[1].' をアクセス'.$state.'に設定しました。コメントやトラックバック'.($new?'も':'は').'受け付けません');
  }
  $new_ban_list[] = $ips[0].'|'.$ips[1].'|'.trim($_POST['ban-access'][$i]);
 }
 rewrite_ini($ban_ini_file, $new_ban_list);
}

if(($ip=v_('NCIP'))!=''){ // カウントしないIPの登録
 if(!preg_match('/^\d{1,3}\.\d{1,3}\.\d{1,3}\.(\d{1,3}|\*)$/', $ip)){
  showMessage('送られた数字はIPアドレスっぽくないです...');
 } else {
  list($res, $index) = test_ip($ip, TRUE, $notcount_ini_file);
  if($res==1){
   list(,$org,) = explode('|', $NC_LIST[$index]);
   showMessage('そのIPは '.$org.' として既に登録済みです;-)');
  } elseif($res==-1){
   list(,$org,) = explode('|', $NC_LIST[$index]);
   showMessage('IP: '.$ip.' を '.$org.' と入れ替えました');
   $NC_LIST[$index] = time().'|'.$ip.'|0'.NL;
   rewrite_ini($notcount_ini_file, $NC_LIST);
  } else {
   array_push($NC_LIST, time().'|'.$ip.'|0');
   rewrite_ini($notcount_ini_file, $NC_LIST);
   showMessage('IP: '.$ip.' を統計除外リストに追加しました');
  }
 }
}

if(($ex=strtolower(v_('EXWORD'))) != ''){ // カウントしないキーワードの登録
 if(!preg_match('/[a-z0-9;\.\-\_]/i', $ex)){
  showMessage('送られた数字は英数字ではない様です...');
 } else {
  $hit = preg_grep("{\t$ex\t}i", $NC_LIST);
  if(!empty($hit)){
   showMessage('そのはキーワードは既に登録済みです;-)');
  } else {
   array_push($NC_LIST, time()."|\t".$ex."\t|0");
   rewrite_ini($notcount_ini_file, $NC_LIST);
   showMessage('キーワード: '.$ex.' を統計除外キーワードに追加しました');
  }
 }
}

if(v_('sub')=='access' && v_('import')=='do'){ // カウントしないIPへの拒否リストからのインポート
 $new_NC_LIST = array();
 $NC_LIST = array_merge($NC_LIST, $BAN_LIST);
 $NC_LIST = array_unique($NC_LIST);
 usort($NC_LIST, 'sort_by_date');
 rewrite_ini($notcount_ini_file, $NC_LIST);
 showMessage('インポートに成功しました');
}

# 実行ここまで

if(v_('sub')=='access'){ # アクセスカウントをしないIP設定
 $body .= '
<form action="admin.php" method="post" style="width: 580px;margin: 1.5em auto 1em auto;">
<fieldset>
<legend>ログ記録除外のIPの設定</legend>
<p class="center" style="padding-top: 1em; font-size: 12px; color:#777;">説明の表示は、右上の「Help」タブをクリック。</p>
<ul class="p2em" style="width: 390px; display:'.($helperState?'block':'none').';">
 <li>アクセスは許可するけど統計しないIPアドレスを設定します</li>
 <li>例えば、Googleなどの検索ロボットのアクセスは受け付けるけど、アクセスカウントは不要なんて場合に有効です</li>
 <li>IPアドレスの4つ目にはワイルドカード(*)を指定できます</li>
 <li>下のセクションで、コメントやトラックバック受信を拒否したIPアドレスをインポートすることが出来ます</li>
</ul><p class="helper" onclick="toggleHelper(this);" title="説明を閉じる">　</p>
<p class="center" style="font-size: 12px; margin-top: 1em;"><span class="alert">例）192.0.34.* で192.0.34.0 ～ 192.0.34.255 のIPアドレスをカバーします</span></p>
<div class="hidden">
 <input type="hidden" name="mode" value="ban" />
 <input type="hidden" name="sub" value="access" />
</div>
<p class="center" style="padding: 0.7em;">
設定したいIPアドレス <input type="text" name="NCIP" id="NCIP" size="10" value="" />
<input type="submit" value="追 加" />
</p>
</fieldset>
</form>

<form action="admin.php" id="ip-list" method="post" style="width: 580px;">
<fieldset>
<legend>IP 登 録 状 況 </legend>
<div class="hidden">
 <input type="hidden" name="mode" value="ban" />
 <input type="hidden" name="sub" value="access" />
</div>
<ul class="p2em" style="width: 390px;">
 <li>アクセスをカウントしないIPリストです。</li>
 <li>アクセス自体が拒否されるものではありません。</li>
 <li>コメントやトラックバック受信を拒否したIPアドレスをインポートするなら
 <a href="admin.php?mode=ban&amp;sub=access&amp;import=do">ここ</a>をクリック</li>
</ul>
';
 include($notcount_ini_file); // again!
 if(!empty($NC_LIST)){
  $body .= '<table cellspacing="0" cellpadding="1" style="border: solid 1px #333; width: 460px; margin: 1em auto;">
 <tr style="background:url(Images/grad.png) repeat-x;height:22px;"><th>登録日</th><th>IPアドレス</th><th>設定解除</th></tr>
 ';
 } else $body .= '<p class="center" style="margin: 1em;">■今のところ登録はありません</p>'.NL;

 foreach ($NC_LIST as $i=>$ip){
  if(strpos(" $ip", "\t")) continue;
  list($d, $_ip,) = explode('|', $ip);
  $bg = ($i%2==1) ? '#eff1f3' : '#fff';
  $body .= '<tr style="background:'.$bg.';"><td>'.date('Y/m/d H:i:s', $d).'</td><td>'.$_ip.'</td><td><a href="admin.php?mode=ban&amp;sub=access&amp;RELIP='.$_ip.'" onclick="return my_confirm(\'このIPをリストから\')"><img src="Images/trash.png" alt="Delete" title="設定解除" class="icon16x16" /></a></td></tr>'.NL;
 }
 $body .= '</table>'.NL.'</fieldset>'.NL.'</form>'.NL;
}

if(v_('sub')=='exwords'){ # アクセスカウントをしないワード設定
 $body .= '
<form action="admin.php" method="post" style="width: 580px;margin: 1.5em auto 1em auto;">
<fieldset>
<legend>ログ記録除外のキーワードの設定</legend>
<p class="center" style="padding-top: 1em; font-size: 12px; color:#777;">説明の表示は、右上の「Help」タブをクリック。</p>
<ul class="p2em" style="width: 450px; display:'.($helperState?'block':'none').';">
 <li>アクセスは許可するけどアクセス解析のためのログを記録しないキーワードを設定します</li>
 <li>この場合、キーワードとは、UA(ユーザーエージェント)やホスト名に含まれる半角英数字からなる文字を指します。例えば、グーグルのクローラーは<strong style="color: crimson;"> googlebot/2.1 (+http://www.google.com/bot.html) </strong>というUA名を名乗っています。クローラーの頻繁なアクセスはアクセスログの肥大を招きますので、こいうのはログに記録しなくても良いかと思います。この場合は、<strong style="color: crimson;">bot</strong> というキーワードを登録すると良いです。他には、<strong style="color: crimson;">spider</strong> や<strong style="color: crimson;"> crawl </strong>なども良いでしょう。</li>
 <li>ホスト名とは、<strong>http://example.com</strong> などの具体的なドメイン名です。例えば、予期しない頻繁なアクセスが http://*****.cn などからあった場合、これもログ肥大化の原因になるので、<strong style="color: crimson;">.cn</strong> というキーワードを登録する、という感じです。</li>
 <li><span style="color: firebrick;">大文字小文字の区別はしません。</span>Bot も bot も同じです。</li></ul><p class="helper" onclick="toggleHelper(this);" title="説明を閉じる">　</p>
<div class="hidden">
 <input type="hidden" name="mode" value="ban" />
 <input type="hidden" name="sub" value="exwords" />
</div>
<p class="center" style="padding: 0.7em;">
設定したいキーワード <input type="text" name="EXWORD" id="EXWORD" size="10" value="" />
<input type="submit" value="追 加" />
</p>
</fieldset>
</form>

<form action="admin.php" id="ip-list" method="post" style="width: 580px;">
<fieldset>
<legend>キーワード 登 録 状 況 </legend>
<div class="hidden">
 <input type="hidden" name="mode" value="ban" />
 <input type="hidden" name="sub" value="exwords" />
</div>
<ul class="p2em" style="width: 390px;">
 <li>アクセスをカウントしないキーワードリストです</li>
 <li>アクセス自体が拒否されるものではありません。</li>
</ul>
';
 include($notcount_ini_file); // again!
 $hits = preg_grep("{\t}", $NC_LIST);
 if(!empty($hits)){
  $hits = array_values($hits);
  $body .= '<table cellspacing="0" cellpadding="1" style="border: solid 1px #333; width: 460px; margin: 1em auto;">
 <tr style="background:url(Images/grad.png) repeat-x;height:22px;"><th>登録日</th><th>キーワード</th><th>設定解除</th></tr>
 ';
 } else $body .= '<p class="center" style="margin: 1em;">■今のところ登録はありません</p>'.NL;

 foreach ($hits as $i=>$ex){
  list($d, $ex,) = explode("\t", $ex);
  $bg = ($i%2==1) ? '#eff1f3' : '#fff';
  $body .= '<tr style="background:'.$bg.';"><td>'.date('Y/m/d H:i:s', str_replace('|', '', $d)).'</td><td>'.$ex.'</td><td><a href="admin.php?mode=ban&amp;sub=exwords&amp;RELWORD='.$ex.'" onclick="return my_confirm(\'このキーワードをリストから\')"><img src="Images/trash.png" alt="Delete" title="設定解除" class="icon16x16" /></a></td></tr>'.NL;
 }
 $body .= '</table>'.NL.'</fieldset>'.NL.'</form>'.NL;
}

if(v_('sub')=='ngwords'){ # NGワードの設定

 $body .= '
 <ul class="p2em" style="width: 380px;">
  <li>「環境設定」>> 「コメント・TB関連」での設定により、NGワードを含むコメントやトラックバックは<strong>'.(ACCEPT_NGWORD?'受信可':'受信不可').'</strong>になっています</li>
 <li>NGワード拒否の設定が有効なときは、コメントやトラックバックにNGワードが含まれていれば、それらの受信を無効にすることができます</li>
  
 </ul>
<form action="admin.php" method="post" style="width: 580px;margin-bottom: 1em;">
<fieldset>
<legend>NGワード追加</legend>
<ul class="p2em" style="width: 360px;">
 <li>一単語ずつ登録して下さい</li>
 <li>英単語の場合、大文字・小文字は区別しません</li>
 <li>下のセクションで、登録状況を確認できます</li>
</ul>
<div class="hidden">
 <input type="hidden" name="mode" value="ban" />
 <input type="hidden" name="sub" value="ngwords" />
</div>
<p class="center" style="padding: 0 .7em 2em .7em;">
設定したいNGワード <input type="text" name="NGWORD" id="NGWORD" size="10" value="" />
<input type="submit" value="追 加" />
</p>
</fieldset>
</form>

<form action="admin.php" id="ip-list" method="post" style="width: 580px;">
<fieldset>
<legend>NGワード 登 録 状 況 </legend>
<div class="hidden">
 <input type="hidden" name="mode" value="ban" />
 <input type="hidden" name="sub" value="ngwords" />
</div>
';

 if(!empty($NG_WORDS)){
  $body .= '
 <ul class="p2em" style="width: 360px;">
   <li>NGワードに指定した単語リストです</li>
 </ul>
  ';
  $body .= '<table cellspacing="0" cellpadding="1" style="border: solid 1px #333; width: 200px; margin: -1em auto 1.5em auto;">
 <tr style="background:url(Images/grad.png) repeat-x;height:22px;"><th>NGワード</th><th>設定解除</th></tr>
 ';
 } else $body .= '<p class="center" style="margin: 1em;">■今のところ登録はありません(sex とか porn とか viagra とか効果的)</p>'.NL;

 foreach ($NG_WORDS as $i=>$wd){
  $bg = ($i%2==1) ? '#eff1f3' : '#fff';
  $body .= '<tr style="background:'.$bg.';"><td>'.$wd.'</td><td><a href="admin.php?mode=ban&amp;sub=ngwords&amp;DELNGWORD='.my_encrypt($wd).'" onclick="return my_confirm(\'このNGワードをリストから\')"><img src="Images/trash.png" alt="Delete" title="削 除" class="icon16x16" /></a></td></tr>'.NL;
 }
 $body .= '</table>'.NL.'</fieldset>'.NL.'</form>'.NL;
}


if(v_('sub')=='cmtping' || v_('sub')==''){ # コメントやトラックバック拒否設定
 $body .= '
<script type="text/javascript">/*<![CDATA[*/
function rejectAccess(ip, state){
 var el = d.getElementById("ip-list");
 var selected = d.getElementById("ban-access").selectedIndex==1 ? 0 : 1;
 if(!state){
  var msg = "コメントやトラックバックの送信だけでなく\n\n"
          + "トップページへのアクセスも拒否しますか？";
 } else {
  var msg = "コメントやトラックバックの送信\n\n"
          + "だけ拒否する設定にしますか？";
 }
 if (!confirm(msg)){
  d.getElementById("ban-access").selectedIndex = selected;
  d.getElementById("ban-access").blur();
  return;
 }
 el.submit();
}
/*]]>*/</script>
<form action="admin.php" method="post" style="width: 580px; margin: 2em auto 1em auto;">
<fieldset>
<legend>コメント・Ping拒否IPの追加</legend>
<ul class="p2em" style="width: 390px;">
 <li>コメントやトラックバックへの投稿を拒否するIPを追加します</li>
 <li>設定次第でトップページへのアクセス自体を拒否できます</li>
 <li>IPアドレスの4つ目にはワイルドカード(*)を指定できます</li>
</ul>
<p class="center"><span class="alert" style="font-size: 12px;">例）192.0.34.* で192.0.34.0 ～ 192.0.34.255 のIPアドレスをカバーします</span></p>
<div class="hidden">
 <input type="hidden" name="mode" value="ban" />
 <input type="hidden" name="sub" value="cmtping" />
</div>
<p class="center" style="padding: 0.7em;">
拒否したいIPアドレス <input type="text" name="IP" id="IP" size="10" value="" />
<input type="submit" value="追 加" />
</p>
</fieldset>
</form>

<form action="admin.php" id="ip-list" method="post" style="width: 580px;">
<fieldset>
<legend>コメント・Ping拒否IPの管理</legend>
<div class="hidden">
 <input type="hidden" name="mode" value="ban" />
 <input type="hidden" name="sub" value="cmtping" />
</div>
<ul class="p2em" style="width: 390px;">
 <li>コメントやトラックバックへの投稿を拒否するIPリストです</li>
 <li>「アクセス設定」を「拒否」にするとトップページにアクセスしても弾くことができます（404を返します）。</li>
</ul>
';

 include($ban_ini_file); // again!

 if(!empty($BAN_LIST)){
  $body .= '<table cellspacing="0" cellpadding="1" style="border: solid 1px #333; width: 500px; margin: 1em auto;">
 <tr style="background:url(Images/grad.png) repeat-x;height:22px;"><th>登録日</th><th>IPアドレス</th><th>アクセス設定</th><th>拒否解除</th></tr>
 ';
 } else $body .= '<p class="center" style="margin: 1em;">■今のところ登録はありません</p>'.NL;

 foreach ($BAN_LIST as $i=>$ip){
  list($d, $_ip, $reject) = explode('|', $ip);
  $bg = ($i%2==1) ? '#eff1f3' : '#fff';
  $ok = ($reject==0) ? ' selected="selected"' : '';
  $not = ($reject==1) ? ' selected="selected"' : '';
  $rf = '<select name="ban-access[]" id="ban-access" onchange="rejectAccess(\''.trim($_ip).'\','.trim($reject).');"><option'.$ok.' value="0"> 許可　</option><option'.$not.' value="1"> 拒否　</option></select>';
  $body .= '<tr style="background:'.$bg.';"><td>'.date('Y/m/d H:i:s', $d).'</td><td>'.$_ip.'</td><td>'.$rf.'</td><td><a href="admin.php?mode=ban&amp;sub=cmtping&amp;RELIP='.$_ip.'" onclick="return my_confirm(\'このIPをリストから\')"><img src="Images/trash.png" alt="Delete" title="拒否解除" class="icon16x16" /></a></td></tr>'.NL;
 }
 $body .= '</table>'.NL.'</fieldset>'.NL.'</form>'.NL;
}

return $DIVISION['body'] .= $header.$body;

?>